package org.ccay.core.exception;

import org.ccay.core.exception.impl.ExceptionMessageManager;


/**
 * 系统异常的基类，为RuntimeException<br/>
 * 应用通常不应该捕捉本类及子类
 * 
 * @since 2011-8-25
 */
public abstract class SystemException extends RuntimeException implements ICodeProvided{
 
	private static final long serialVersionUID = -1352323993289725490L; 

	protected String errorCode;
	
	protected Object[] args;	
	
	/**
	 * 获取异常码
	 * @return errorCode
	 */
	public String getErrorCode() {
		return errorCode;
	}

	/**
	 * 默认构造
	 */
	public SystemException(){
		super();
	}
	
	/**
	 * 根据异常码构造
	 * @param errorCode 异常码
	 */
	public SystemException(String errorCode){		
		super();	
		this.errorCode = errorCode;
	}
	
	/**
	 * 根据异常码及错误消息构造
	 * @param errorCode 异常码
	 */
	public SystemException(String errorCode,String errorMessage){		
		super(errorMessage);	
		this.errorCode = errorCode;
	}
	
	/**
	 * 根据异常码构造
	 * @param errorCode 异常码
	 * @param args 可选参数，使用MessageFormat格式化到Message中
	 */
	public SystemException(String errorCode,Object... args){		
		super();	
		this.errorCode = errorCode;
		this.args = args;		
	}
	
	/**
	 * 根据异常码异常消息构造
	 * @param errorCode 异常码
	 * @param errorMessage 异常消息
	 * @param args 可选参数，使用MessageFormat格式化到Message中
	 */
	public SystemException(String errorCode,String errorMessage,Object... args){		
		super(errorMessage);	
		this.errorCode = errorCode;
		this.args = args;		
	}
	
	
	
	/**
	 * 根据异常码和原始异常构造
	 * @param errorCode 异常码
	 * @param innerException 原始异常
	 */
	public SystemException(String errorCode,Throwable innerException){	
		super(innerException);
		this.errorCode = errorCode;
	}
	
	/**
	 * 根据异常码，异常消息和原始异常构造
	 * @param errorCode 异常码
	 * @param innerException 原始异常
	 */
	public SystemException(String errorCode,String errorMessage,Throwable innerException){	
		super(errorMessage,innerException);
		this.errorCode = errorCode;
	}
	
	
	/**
	 * 根据原始异常构造
	 * @param innerException 原始异常
	 */
	public SystemException(Throwable innerException){	
		super(innerException);
		this.errorCode = "ccay.core.99999999";
		this.args = new Object[]{innerException.getMessage()};
	}
	
	/**
	 * 根据异常码和原始异常构造
	 * @param errorCode 异常码
	 * @param innerException 原始异常
	 * @param args 可选参数，使用MessageFormat格式化到Message中
	 */
	public SystemException(String errorCode,Throwable innerException,Object... args){	
		super(innerException);
		this.errorCode = errorCode;
		this.args = args;
	}
	/**
	 * 根据异常码异常消息和原始异常构造
	 * @param errorCode 异常码
	 * @param errorMessage 异消息
	 * @param innerException 原始异常
	 * @param args 可选参数，使用MessageFormat格式化到Message中
	 */
	public SystemException(String errorCode,String errorMessage,Throwable innerException,Object... args){	
		super(errorMessage,innerException);
		this.errorCode = errorCode;
		this.args = args;
	}

	/**
	 * 获取本地化的异常信息
	 */
	@Override
	public String getMessage(){
		if(super.getMessage() != null && !super.getMessage().isEmpty()){
			return super.getMessage();
		}
		return ExceptionMessageManager.getMessage(errorCode,args);
	}

}
